﻿using System;
using System.Windows;
using System.Windows.Threading;
using DataBaseLibrary.DBInterfaces;
using DataBaseLibrary.DBObjectsFB;
using DocMreoLiteVersion.Reports.DrivingLicenseReport;
using DocMreoLiteVersion.Reports.SaleContractReport;
using DocMreoLiteVersion.Reports.DeclarationReport;

namespace DocMreoLiteVersion
{

    public class UserSession
    {
        public User user { get; set; }


        private bool isActivate = false;

        /// <summary>
        /// ВОзвращает признак true, если пользователь активирован
        /// </summary>
        public bool IsActivate {
            get { return isActivate; } 
            private set { isActivate = value; } 
        
        }

        private IDBProvider provider;

        public UserSession(IDBProvider provider)
        {
            this.provider = provider;
        }


        public bool UserActivate(String userName, String password)
        {
            user = new UserFdb(provider, userName, password);
            try
            {
                if (user.AuthorizeUser())
                {
                    IsActivate = true;
                    return true;
                }
                else
                {
                    IsActivate = false;
                    return false;
                }
            }
            catch (Exception)
            {

                IsActivate = false;
                return false;
            }           

        }

    }



    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

       


        private IDBProvider db_provider = null;

        public static UserSession session = null; //Текущая сессия пользователя
        private System.Threading.Mutex m; //Мьютекс

        public MainWindow()
        {


            //TODO: Читать настройки потом из конфига к приложению (xml). Если его нет, то создать. В качестве имени мьютекса использовать GUID. генерировать его при создании конфига
            //следующим образом: System.GUID.NewGuid().ToString()
            bool mutex_app;
            m = new System.Threading.Mutex(true, "{1-8996-3665-112-33654}", out mutex_app);
            

                //MessageBox.Show(mutex_app.ToString());
            if (!mutex_app)
            {
                MessageBox.Show("Приложение уже запущено!");
                this.Close();
            }

            GC.KeepAlive(m); 

            InitializeComponent();

        }

        private bool ConnectDB(String PathDB)
        {
            db_provider = new FDBProvider(PathDB, "SYSDBA", "masterkey");
            return db_provider.Connect();
        }

        

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {

            timeTimer = new DispatcherTimer();
            timeTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            timeTimer.Interval = new TimeSpan(0, 0, 1);
            timeTimer.Start();

            CSettings.LoadSettings();            
            if (!ConnectDB(CSettings.PathDB + "DOCMREODB.FDB"))
            {
                MessageBox.Show("Ошибка при подключении к базе данных. \nОбращайтесь к разработчикам", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }


            LockUnlockAllMenu(true);

            CreateSession();
   
        }

        /// <summary>
        /// Создание сессии пользователя
        /// </summary>
        private void CreateSession()
        {
            //Настройки и соединение с базой данных
            session = new UserSession(db_provider);
            AutorizeUserControl autorizeUserControl = new AutorizeUserControl(session);
            autorizeUserControl.AutorizeExecuted += autorizeUserControl_AutorizeExecuted;
            m_DetailGrid.Children.Clear();
            m_DetailGrid.Children.Add(autorizeUserControl);
        }

        private void DeleteSession()
        {
            m_DetailGrid.Children.Clear();
            LockUnlockAllMenu(true);
            CreateSession();
        }

        /// <summary>
        /// Авторизация выполнена
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void autorizeUserControl_AutorizeExecuted(object sender, RoutedEventArgs e)
        {
            DeleteUserControlFromGrid(null);
            SystemMenuItem.IsEnabled = true;
            DocumentSelectMenu.IsEnabled = true;
            UserControlMenuItem.IsEnabled = true;

            if (session.IsActivate)
            {
                LockUnlockAllMenu(false);
                LockUnlockMenuForOperator(session.user.GetPrivelegies());
            }

        }

        //Блокирует меню для пользователя/администратора
        private void LockUnlockMenuForOperator(User.Privelegies privelegies)
        {
            if (privelegies == User.Privelegies.Operator)
            {
                CreateUserMenuItem.IsEnabled = false;
                DeleteUserMenuItem.IsEnabled = false;
                SettingsMenuItem.IsEnabled = false;
            }
            if (privelegies == User.Privelegies.GrandAll)
            {
                CreateUserMenuItem.IsEnabled = true;
                DeleteUserMenuItem.IsEnabled = true;
                SettingsMenuItem.IsEnabled = true;
            }
        }

        //Блокирует/разблокирует все меню
        private void LockUnlockAllMenu(bool IsLock)
        {
            if (IsLock)
            {
                CreateUserMenuItem.IsEnabled = false;
                DeleteUserMenuItem.IsEnabled = false;
                SettingsMenuItem.IsEnabled = false;
                ExitSession.IsEnabled = false;
                DocumentSelectMenu.IsEnabled = false;
            }
            else
            {
                CreateUserMenuItem.IsEnabled = true;
                DeleteUserMenuItem.IsEnabled = true;
                SettingsMenuItem.IsEnabled = true;
                ExitSession.IsEnabled = true;
                DocumentSelectMenu.IsEnabled = true;                
            }
        }

        private void MenuItem_CloseSessionClick(object sender, RoutedEventArgs e)
        {
            DeleteSession();            
        }

        private void MenuItem_CreateUserClick(object sender, RoutedEventArgs e)
        {            
            UserCreateWindow userCreateWindow = new UserCreateWindow(db_provider);
            userCreateWindow.Owner = System.Windows.Application.Current.MainWindow;
            if (userCreateWindow.ShowDialog() ?? true)
            {
                MessageBox.Show("Пользователь создан!");
            }
        }

        private void DeleteUserMenuItem_OnClick(object sender, RoutedEventArgs e)
        {
            IDBLogic logic = new FDBLogic(db_provider);
            IDBLogic.ResultFields result = logic.GetAllUsers(session.user);
            SearchResultTable tableDlg = new SearchResultTable(result);
            tableDlg.Owner = System.Windows.Application.Current.MainWindow;
            if (tableDlg.ShowDialog() ?? true)
            {
                try
                {
                    User user = new UserFdb(db_provider, "", "");
                    user.DeleteUser(session.user, tableDlg.ReturnObject);
                    MessageBox.Show("Пользователь удален!");
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                }
            }
        }


    }
}
